#include <mqueue.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
/**
 * 生产者进程：不断读取输入内容，发送到消息队列
 */
int main()
{
    char *mq_name = "/p_c_mq";

    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 100;

    // 创建或打开消息队列
    mqd_t mqdes = mq_open(mq_name, O_CREAT | O_WRONLY, 0666, &attr);
    if (mqdes == -1)
    {
        perror("打开消息队列失败");
        return 1;
    }

    char write_buf[100];

    while (1)
    {
        // 清空写缓冲区
        memset(write_buf, 0, 100);

        // 从命令行标准输入读取数据
        ssize_t read_count = read(STDIN_FILENO, write_buf, 100);

        // 如果接收到命令行的EOF（Ctrl+D），read将返回0，此时向消费者端发送信息并退出
        if (read_count == 0)
        {
            printf("生产者接收到退出的命令\n");
            char eof = EOF;
            // 发送EOF消息通知消费者
            mq_send(mqdes, &eof, 1, 0);
            // 跳出循环，进入退出流程
            break;
        }

        // 没有接收到命令行的EOF，正常发送数据
        mq_send(mqdes, write_buf, strlen(write_buf), 0);

        printf("从命令行接收到数据，已发送至消费者端\n");
    }

    // 关闭描述符
    close(mqdes);
    // mq_unlink 只应调用一次，我们选择在生产者中完成此操作
    // 清除消息队列
    mq_unlink(mq_name);

    return 0;
}